package top.mihile.cableMonitorMedia.utils;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * FFmpeg 版本适配器
 * 支持 FFmpeg 4.x 和 7.x 多个版本
 * 
 * @author AI Assistant
 * @date 2025/10/13
 */
public class FfmpegVersionAdapter {
    
    private static Integer majorVersion = null;
    private static Integer minorVersion = null;
    private static String fullVersion = null;
    
    /**
     * 检测 FFmpeg 版本
     */
    public static void detectVersion() {
        try {
            ProcessBuilder pb = new ProcessBuilder("ffmpeg", "-version");
            Process process = pb.start();
            
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line = reader.readLine();
            
            if (line != null) {
                // 解析版本号，格式如: ffmpeg version 4.4.2 或 ffmpeg version 7.0
                Pattern pattern = Pattern.compile("ffmpeg version (\\d+)\\.(\\d+)");
                Matcher matcher = pattern.matcher(line);
                
                if (matcher.find()) {
                    majorVersion = Integer.parseInt(matcher.group(1));
                    minorVersion = Integer.parseInt(matcher.group(2));
                    fullVersion = matcher.group(0);
                    System.out.println("检测到 FFmpeg 版本: " + fullVersion);
                }
            }
            
            process.waitFor();
            reader.close();
        } catch (Exception e) {
            System.err.println("无法检测 FFmpeg 版本，将使用默认参数");
            e.printStackTrace();
        }
    }
    
    /**
     * 获取主版本号
     */
    public static Integer getMajorVersion() {
        if (majorVersion == null) {
            detectVersion();
        }
        return majorVersion != null ? majorVersion : 4; // 默认假设为版本 4
    }
    
    /**
     * 获取完整版本信息
     */
    public static String getFullVersion() {
        if (fullVersion == null) {
            detectVersion();
        }
        return fullVersion != null ? fullVersion : "unknown";
    }
    
    /**
     * 是否为 FFmpeg 7.x 或更高版本
     */
    public static boolean isVersion7OrHigher() {
        return getMajorVersion() >= 7;
    }
    
    /**
     * 是否为 FFmpeg 4.x
     */
    public static boolean isVersion4() {
        int version = getMajorVersion();
        return version >= 4 && version < 7;
    }
    
    /**
     * 是否支持 reconnect 参数
     * reconnect 参数在 FFmpeg 3.3+ 版本中引入
     */
    public static boolean supportsReconnect() {
        int major = getMajorVersion();
        // FFmpeg 4.x 及以上都支持
        if (major >= 4) {
            return true;
        }
        // FFmpeg 3.3+ 支持
        if (major == 3 && minorVersion != null && minorVersion >= 3) {
            return true;
        }
        return false;
    }
    
    /**
     * 构建兼容的 FFmpeg 命令
     * 
     * @param url RTSP URL
     * @param port 服务器端口
     * @param playChannel 播放通道 UUID
     * @param enableAudio 是否启用音频
     * @return FFmpeg 命令列表
     */
    public static List<String> buildCompatibleCommand(String url, Integer port, String playChannel, boolean enableAudio) {
        List<String> commands = new ArrayList<>();
        
        commands.add("ffmpeg");
        
        // 输入参数 - 根据版本选择超时参数
        commands.add("-rtsp_transport");
        commands.add("tcp");
        
        // RTSP 超时参数（不同版本使用不同参数）
        if (isVersion7OrHigher()) {
            // FFmpeg 7.x 使用 -timeout
            commands.add("-timeout");
            commands.add("5000000");  // 5秒超时
            commands.add("-rtsp_flags");
            commands.add("prefer_tcp");
        } else {
            // FFmpeg 4.x 使用 -stimeout
            commands.add("-stimeout");
            commands.add("5000000");  // 5秒超时
        }
        
        commands.add("-i");
        commands.add(url);
        
        // 视频编码参数
        commands.add("-q");
        commands.add("0");
        commands.add("-f");
        commands.add("mpegts");
        
        // FFmpeg 7.0 中 -codec:v 仍然兼容，但推荐使用 -c:v
        if (isVersion7OrHigher()) {
            commands.add("-c:v");
        } else {
            commands.add("-codec:v");
        }
        commands.add("mpeg1video");
        
        // 音频参数
        if (!enableAudio) {
            commands.add("-an");
        } else {
            if (isVersion7OrHigher()) {
                commands.add("-c:a");
            } else {
                commands.add("-codec:a");
            }
            commands.add("mp2");
            commands.add("-ar");
            commands.add("44100");
            commands.add("-ac");
            commands.add("1");
            commands.add("-b:a");
            commands.add("128k");
        }
        
        // 视频尺寸
        commands.add("-s");
        commands.add("1920x1080");
        
        // FFmpeg 7.0 优化：添加线程数控制
        if (isVersion7OrHigher()) {
            commands.add("-threads");
            commands.add("2");
        }
        
        // 输出 URL
        commands.add("http://127.0.0.1:" + port + "/stream/upload/" + playChannel);
        
        return commands;
    }
    
    /**
     * 构建灵活分辨率的命令（支持自适应）
     */
    public static List<String> buildAdaptiveCommand(String url, Integer port, String playChannel, 
                                                    boolean enableAudio, String resolution) {
        List<String> commands = new ArrayList<>();
        
        commands.add("ffmpeg");
        
        // 输入参数 - 根据版本选择超时参数
        commands.add("-rtsp_transport");
        commands.add("tcp");
        
        // RTSP 超时参数（不同版本使用不同参数）
        if (isVersion7OrHigher()) {
            // FFmpeg 7.x 使用 -timeout
            commands.add("-timeout");
            commands.add("5000000");  // 5秒超时
            commands.add("-rtsp_flags");
            commands.add("prefer_tcp");
        } else {
            // FFmpeg 4.x 使用 -stimeout
            commands.add("-stimeout");
            commands.add("5000000");  // 5秒超时
        }
        
        commands.add("-i");
        commands.add(url);
        
        // 视频编码
        commands.add("-q");
        commands.add("0");
        commands.add("-f");
        commands.add("mpegts");
        
        if (isVersion7OrHigher()) {
            commands.add("-c:v");
        } else {
            commands.add("-codec:v");
        }
        commands.add("mpeg1video");
        
        // 音频处理
        if (!enableAudio) {
            commands.add("-an");
        } else {
            if (isVersion7OrHigher()) {
                commands.add("-c:a");
            } else {
                commands.add("-codec:a");
            }
            commands.add("mp2");
            commands.add("-ar");
            commands.add("44100");
            commands.add("-ac");
            commands.add("1");
            commands.add("-b:a");
            commands.add("128k");
        }
        
        // 分辨率设置
        if (resolution != null && !resolution.isEmpty()) {
            commands.add("-s");
            commands.add(resolution);
        } else {
            // 默认分辨率
            commands.add("-s");
            commands.add("1920x1080");
        }
        
        // 性能优化（FFmpeg 7.0）
        if (isVersion7OrHigher()) {
            commands.add("-threads");
            commands.add("2");
            commands.add("-preset");
            commands.add("ultrafast");
        }
        
        commands.add("http://127.0.0.1:" + port + "/stream/upload/" + playChannel);
        
        return commands;
    }
    
    /**
     * 打印命令用于调试
     */
    public static void printCommand(List<String> commands) {
        System.out.println("=== FFmpeg 命令 (版本: " + getFullVersion() + ") ===");
        System.out.println(String.join(" ", commands));
        System.out.println("===========================================");
    }
}

